--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
electron/offlineRecovery.js v4.7.2-rc.5 (868d1d64) Text, 6.03 KB
Ta5d6ff"use strict"Tb4b4b4;
Tff7b72const Te6edf3fs Tff7b72= Te6edf3requireTb4b4b4(Ta5d6ff"node:fs"Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3path Tff7b72= Te6edf3requireTb4b4b4(Ta5d6ff"node:path"Tb4b4b4)Tb4b4b4;
Tff7b72const Tb4b4b4{ Te6edf3diagnoseBackendCrash Tb4b4b4} Tff7b72= Te6edf3requireTb4b4b4(Ta5d6ff"./backendCrashReport"Tb4b4b4)Tb4b4b4;
T8b949e/**
* @param {string} dir
* @param {"auto"|"snapshot"} kind
* @returns {Array<{name: string, path: string, size: number, createdAt: string, kind: string, suspicious: boolean}>}
*/
Tff7b72function Te6edf3listZipBackupsInDirTb4b4b4(Te6edf3dirTb4b4b4, Te6edf3kindTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3dir Tff7b72|| Tff7b72!Te6edf3fsTb4b4b4.Te6edf3existsSyncTb4b4b4(Te6edf3dirTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72return Tb4b4b4[Tb4b4b4]Tb4b4b4;
Tb4b4b4}
Tff7b72const Te6edf3entries Tff7b72= Tb4b4b4[Tb4b4b4]Tb4b4b4;
Tff7b72for Tb4b4b4(Tff7b72const Te6edf3name Tff7b72of Te6edf3fsTb4b4b4.Te6edf3readdirSyncTb4b4b4(Te6edf3dirTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3nameTb4b4b4.Te6edf3endsWithTb4b4b4(Ta5d6ff".zip"Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72continueTb4b4b4;
Tb4b4b4}
Tff7b72const Te6edf3fullPath Tff7b72= Te6edf3pathTb4b4b4.Te6edf3joinTb4b4b4(Te6edf3dirTb4b4b4, Te6edf3nameTb4b4b4)Tb4b4b4;
Tff7b72try Tb4b4b4{
Tff7b72const Te6edf3stats Tff7b72= Te6edf3fsTb4b4b4.Te6edf3statSyncTb4b4b4(Te6edf3fullPathTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3statsTb4b4b4.Te6edf3isFileTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72continueTb4b4b4;
Tb4b4b4}
Te6edf3entriesTb4b4b4.Te6edf3pushTb4b4b4(Tb4b4b4{
Te6edf3nameTb4b4b4,
Te6edf3pathTff7b72: Te6edf3fullPathTb4b4b4,
Te6edf3sizeTff7b72: Te6edf3statsTb4b4b4.Te6edf3sizeTb4b4b4,
Te6edf3createdAtTff7b72: Tff7b72new Tffa657DateTb4b4b4(Te6edf3statsTb4b4b4.Te6edf3mtimeMsTb4b4b4)Tb4b4b4.Te6edf3toISOStringTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3kindTb4b4b4,
Te6edf3suspiciousTff7b72: Ta5d6ff/SUSPICIOUS/iTb4b4b4.Te6edf3testTb4b4b4(Te6edf3nameTb4b4b4)Tb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4{
T8b949e// skip unreadable entries
Tb4b4b4}
Tb4b4b4}
Tff7b72return Te6edf3entriesTb4b4b4;
Tb4b4b4}
T8b949e/**
* @param {string} storageDir
* @returns {Array<{name: string, path: string, size: number, createdAt: string, kind: string, suspicious: boolean}>}
*/
Tff7b72function Te6edf3listRecoveryBackupsTb4b4b4(Te6edf3storageDirTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3storageDirTb4b4b4) Tb4b4b4{
Tff7b72return Tb4b4b4[Tb4b4b4]Tb4b4b4;
Tb4b4b4}
Tff7b72const Te6edf3auto Tff7b72= Te6edf3listZipBackupsInDirTb4b4b4(Te6edf3pathTb4b4b4.Te6edf3joinTb4b4b4(Te6edf3storageDirTb4b4b4, Ta5d6ff"database-backups"Tb4b4b4)Tb4b4b4, Ta5d6ff"auto"Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3snapshots Tff7b72= Te6edf3listZipBackupsInDirTb4b4b4(Te6edf3pathTb4b4b4.Te6edf3joinTb4b4b4(Te6edf3storageDirTb4b4b4, Ta5d6ff"snapshots"Tb4b4b4)Tb4b4b4, Ta5d6ff"snapshot"Tb4b4b4)Tb4b4b4;
Tff7b72return Tb4b4b4[Tb4b4b4...Te6edf3autoTb4b4b4, Tb4b4b4...Te6edf3snapshotsTb4b4b4]Tb4b4b4.Te6edf3sortTb4b4b4(Tb4b4b4(Te6edf3aTb4b4b4, Te6edf3bTb4b4b4) Tb4b4b4=> Tffa657DateTb4b4b4.Te6edf3parseTb4b4b4(Te6edf3bTb4b4b4.Te6edf3createdAtTb4b4b4) Tff7b72- Tffa657DateTb4b4b4.Te6edf3parseTb4b4b4(Te6edf3aTb4b4b4.Te6edf3createdAtTb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
T8b949e/**
* @param {Array<{suspicious: boolean, createdAt: string}>} backups
* @returns {object|null}
*/
Tff7b72function Te6edf3pickPreferredRestoreBackupTb4b4b4(Te6edf3backupsTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Tffa657ArrayTb4b4b4.Te6edf3isArrayTb4b4b4(Te6edf3backupsTb4b4b4) Tff7b72|| Te6edf3backupsTb4b4b4.Te6edf3length Tff7b72=== T79c0ff0Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72nullTb4b4b4;
Tb4b4b4}
Tff7b72const Te6edf3healthy Tff7b72= Te6edf3backupsTb4b4b4.Te6edf3filterTb4b4b4(Tb4b4b4(Te6edf3entryTb4b4b4) Tb4b4b4=> Tff7b72!Te6edf3entryTb4b4b4.Te6edf3suspiciousTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3healthyTb4b4b4.Te6edf3length Tff7b72> T79c0ff0Tb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3healthyTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4;
Tb4b4b4}
Tff7b72return Te6edf3backupsTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4;
Tb4b4b4}
T8b949e/**
* @param {object} ctx
* @param {string} ctx.storageDir
* @param {string} ctx.reticulumConfigDir
* @param {string} ctx.platform
* @param {string|null} ctx.portableExecutableDir
* @returns {string}
*/
Tff7b72function Te6edf3buildDataCleanupGuideTb4b4b4(Te6edf3ctxTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3storageDir Tff7b72= Te6edf3ctxTb4b4b4.Te6edf3storageDir Tff7b72|| Ta5d6ff"~/.reticulum-meshchatx"Tb4b4b4;
Tff7b72const Te6edf3reticulumDir Tff7b72= Te6edf3ctxTb4b4b4.Te6edf3reticulumConfigDir Tff7b72|| Ta5d6ff"~/.reticulum"Tb4b4b4;
Tff7b72const Te6edf3legacyDir Tff7b72= Te6edf3storageDirTb4b4b4.Te6edf3replaceTb4b4b4(Ta5d6ff/meshchatx$/iTb4b4b4, Ta5d6ff"meshchat"Tb4b4b4)Tb4b4b4.Te6edf3replaceTb4b4b4(Ta5d6ff/MeshChatX$/iTb4b4b4, Ta5d6ff"meshchat"Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3lines Tff7b72= Tb4b4b4[
Ta5d6ff"Complete MeshChatX / Reticulum data reset"Tb4b4b4,
Ta5d6ff""Tb4b4b4,
Ta5d6ff"Quit MeshChatX completely before deleting anything. On Windows, also end ReticulumMeshChatX.exe in Task Manager if it is still running."Tb4b4b4,
Ta5d6ff""Tb4b4b4,
Ta5d6ff"MeshChatX storage (database, identities, automatic backups, logs):"Tb4b4b4,
Ta5d6ff`Ta5d6ff Tffd700${Te6edf3storageDirTffd700}Ta5d6ff`Tb4b4b4,
Ta5d6ff""Tb4b4b4,
Ta5d6ff"Reticulum network stack (config, ratchets, path table, interface state):"Tb4b4b4,
Ta5d6ff`Ta5d6ff Tffd700${Te6edf3reticulumDirTffd700}Ta5d6ff`Tb4b4b4,
Ta5d6ff""Tb4b4b4,
Tb4b4b4]Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3legacyDir Tff7b72&& Te6edf3legacyDir Tff7b72!== Te6edf3storageDirTb4b4b4) Tb4b4b4{
Te6edf3linesTb4b4b4.Te6edf3pushTb4b4b4(Ta5d6ff"Legacy Reticulum MeshChat storage (only if you migrated from the old app):"Tb4b4b4)Tb4b4b4;
Te6edf3linesTb4b4b4.Te6edf3pushTb4b4b4(Ta5d6ff`Ta5d6ff Tffd700${Te6edf3legacyDirTffd700}Ta5d6ff`Tb4b4b4)Tb4b4b4;
Te6edf3linesTb4b4b4.Te6edf3pushTb4b4b4(Ta5d6ff""Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3ctxTb4b4b4.Te6edf3platform Tff7b72=== Ta5d6ff"win32" Tff7b72&& Te6edf3ctxTb4b4b4.Te6edf3portableExecutableDirTb4b4b4) Tb4b4b4{
Te6edf3linesTb4b4b4.Te6edf3pushTb4b4b4(Ta5d6ff"Portable Windows install: the folders above are next to MeshChatX.exe, not in your user profile."Tb4b4b4)Tb4b4b4;
Te6edf3linesTb4b4b4.Te6edf3pushTb4b4b4(Ta5d6ff`Ta5d6ff Portable app folder: Tffd700${Te6edf3ctxTb4b4b4.Te6edf3portableExecutableDirTffd700}Ta5d6ff`Tb4b4b4)Tb4b4b4;
Te6edf3linesTb4b4b4.Te6edf3pushTb4b4b4(Ta5d6ff""Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3linesTb4b4b4.Te6edf3pushTb4b4b4(Ta5d6ff"Linux / macOS default locations:"Tb4b4b4)Tb4b4b4;
Te6edf3linesTb4b4b4.Te6edf3pushTb4b4b4(Ta5d6ff" ~/.reticulum-meshchatx/"Tb4b4b4)Tb4b4b4;
Te6edf3linesTb4b4b4.Te6edf3pushTb4b4b4(Ta5d6ff" ~/.reticulum/"Tb4b4b4)Tb4b4b4;
Te6edf3linesTb4b4b4.Te6edf3pushTb4b4b4(Ta5d6ff" ~/.reticulum-meshchat/ (legacy, if present)"Tb4b4b4)Tb4b4b4;
Te6edf3linesTb4b4b4.Te6edf3pushTb4b4b4(Ta5d6ff""Tb4b4b4)Tb4b4b4;
Te6edf3linesTb4b4b4.Te6edf3pushTb4b4b4(Ta5d6ff"Windows default locations:"Tb4b4b4)Tb4b4b4;
Te6edf3linesTb4b4b4.Te6edf3pushTb4b4b4(Ta5d6ff" %USERPROFILE%\\.reticulum-meshchatx\\"Tb4b4b4)Tb4b4b4;
Te6edf3linesTb4b4b4.Te6edf3pushTb4b4b4(Ta5d6ff" %USERPROFILE%\\.reticulum\\"Tb4b4b4)Tb4b4b4;
Te6edf3linesTb4b4b4.Te6edf3pushTb4b4b4(Ta5d6ff" %USERPROFILE%\\.reticulum-meshchat\\ (legacy, if present)"Tb4b4b4)Tb4b4b4;
Te6edf3linesTb4b4b4.Te6edf3pushTb4b4b4(Ta5d6ff""Tb4b4b4)Tb4b4b4;
Te6edf3linesTb4b4b4.Te6edf3pushTb4b4b4(
Ta5d6ff"Removing these folders deletes your local identity, messages, contacts, and network path cache. You will get a new identity on the next launch unless you restore from a backup zip first."
Tb4b4b4)Tb4b4b4;
Te6edf3linesTb4b4b4.Te6edf3pushTb4b4b4(Ta5d6ff""Tb4b4b4)Tb4b4b4;
Te6edf3linesTb4b4b4.Te6edf3pushTb4b4b4(
Ta5d6ff"Automatic database backups are kept under database-backups/ inside the MeshChatX storage folder when the app has run successfully before."
Tb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3linesTb4b4b4.Te6edf3joinTb4b4b4(Ta5d6ff"\n"Tb4b4b4)Tb4b4b4;
Tb4b4b4}
T8b949e/**
* @param {object} params
* @param {string} params.storageDir
* @param {string} params.reticulumConfigDir
* @param {string} params.platform
* @param {string|null} params.portableExecutableDir
* @param {string} params.stderr
* @param {string} params.stdout
* @param {number|null} params.exitCode
* @returns {object}
*/
Tff7b72function Te6edf3getCrashRecoveryInfoTb4b4b4(Te6edf3paramsTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3backups Tff7b72= Te6edf3listRecoveryBackupsTb4b4b4(Te6edf3paramsTb4b4b4.Te6edf3storageDirTb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3preferredBackup Tff7b72= Te6edf3pickPreferredRestoreBackupTb4b4b4(Te6edf3backupsTb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3diagnosis Tff7b72= Te6edf3diagnoseBackendCrashTb4b4b4(Te6edf3paramsTb4b4b4.Te6edf3stderr Tff7b72|| Ta5d6ff""Tb4b4b4, Te6edf3paramsTb4b4b4.Te6edf3stdout Tff7b72|| Ta5d6ff""Tb4b4b4, Te6edf3paramsTb4b4b4.Te6edf3exitCode Tff7b72?? Tff7b72nullTb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3paths Tff7b72= Tb4b4b4{
Te6edf3storageDirTff7b72: Te6edf3paramsTb4b4b4.Te6edf3storageDir Tff7b72|| Tff7b72nullTb4b4b4,
Te6edf3reticulumConfigDirTff7b72: Te6edf3paramsTb4b4b4.Te6edf3reticulumConfigDir Tff7b72|| Tff7b72nullTb4b4b4,
Te6edf3backupsDirTff7b72: Te6edf3paramsTb4b4b4.Te6edf3storageDir Tff7b72? Te6edf3pathTb4b4b4.Te6edf3joinTb4b4b4(Te6edf3paramsTb4b4b4.Te6edf3storageDirTb4b4b4, Ta5d6ff"database-backups"Tb4b4b4) Tff7b72: Tff7b72nullTb4b4b4,
Te6edf3snapshotsDirTff7b72: Te6edf3paramsTb4b4b4.Te6edf3storageDir Tff7b72? Te6edf3pathTb4b4b4.Te6edf3joinTb4b4b4(Te6edf3paramsTb4b4b4.Te6edf3storageDirTb4b4b4, Ta5d6ff"snapshots"Tb4b4b4) Tff7b72: Tff7b72nullTb4b4b4,
Te6edf3logsDirTff7b72: Te6edf3paramsTb4b4b4.Te6edf3storageDir Tff7b72? Te6edf3pathTb4b4b4.Te6edf3joinTb4b4b4(Te6edf3paramsTb4b4b4.Te6edf3storageDirTb4b4b4, Ta5d6ff"logs"Tb4b4b4) Tff7b72: Tff7b72nullTb4b4b4,
Tb4b4b4}Tb4b4b4;
Tff7b72const Te6edf3cleanupGuide Tff7b72= Te6edf3buildDataCleanupGuideTb4b4b4(Tb4b4b4{
Te6edf3storageDirTff7b72: Te6edf3paramsTb4b4b4.Te6edf3storageDirTb4b4b4,
Te6edf3reticulumConfigDirTff7b72: Te6edf3paramsTb4b4b4.Te6edf3reticulumConfigDirTb4b4b4,
Te6edf3platformTff7b72: Te6edf3paramsTb4b4b4.Te6edf3platformTb4b4b4,
Te6edf3portableExecutableDirTff7b72: Te6edf3paramsTb4b4b4.Te6edf3portableExecutableDirTb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tff7b72return Tb4b4b4{
Te6edf3diagnosisTb4b4b4,
Te6edf3pathsTb4b4b4,
Te6edf3backupsTb4b4b4,
Te6edf3preferredBackupTb4b4b4,
Te6edf3cleanupGuideTb4b4b4,
Te6edf3supportsOfflineRestoreTff7b72: Tffa657BooleanTb4b4b4(Te6edf3paramsTb4b4b4.Te6edf3storageDirTb4b4b4)Tb4b4b4,
Tb4b4b4}Tb4b4b4;
Tb4b4b4}
Te6edf3moduleTb4b4b4.Te6edf3exports Tff7b72= Tb4b4b4{
Te6edf3buildDataCleanupGuideTb4b4b4,
Te6edf3getCrashRecoveryInfoTb4b4b4,
Te6edf3listRecoveryBackupsTb4b4b4,
Te6edf3pickPreferredRestoreBackupTb4b4b4,
Tb4b4b4}Tb4b4b4;
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────